﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO.Ports;
using SmsClient;
using System.Threading;
using System.Timers;
using Terrae.Logica.FabricaLogica;
using Terrae.Clases.FabricaClase;
using Terrae.Logica.Comandos;
using Terrae.Clases;

namespace ServicioTerrae
{
    public partial class ServicioTerrae : ServiceBase
    {
        #region Atributos

        private Terrae.Clases.Arduino arduino;
        private bool verificarTanque;
        private string mensaje1;

        #endregion Atributos

        public ServicioTerrae()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            var timer = new System.Timers.Timer { AutoReset = true, Interval = 60000 };
            timer.Elapsed += timer_Elapsed;
            timer.Start();

            verificarTanque = true;
            // llamamos a verificar el estado 
            VerificarEstadoTanque();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            verificarTanque = false;
            SolicitarDatosInvernadero();
        }

        /// <summary>
        /// Metodo para verificar las bombas.
        /// </summary>
        /// <param name="verificar"></param>
        public void VerificarEstadoTanque()
        {
            while (verificarTanque)
            {
                // creamos una instancia de un objeto del tipo "tanque de agua"
                arduino = new Terrae.Clases.Arduino("COM5", 9600);

                // datos del tanque de agua
                arduino.DigitalReadWrite("7");
                // verificamos que el flotante electrico del agua mande la señal
                if (arduino.ValorRetornado.ToString() == "Si")
                {
                    EnvioMensaje(1);
                }
                // datos del tanque de fertilizante
                arduino.DigitalReadWrite("8");
                // verificamos que el flotante electrico del fertilizante mande la señal
                if (arduino.ValorRetornado.ToString() == "Si")
                {
                    EnvioMensaje(2);
                }
            }

        } // VerificarEstadoTanque

        /// <summary>
        /// Consultamos las variables del invernadero
        /// a través del puerto COM del arduino
        /// </summary>
        /// <param name="idInvernadero"></param>
        public void SolicitarDatosInvernadero()
        {
             Terrae.Clases.Arduino arduino = new Terrae.Clases.Arduino("COM5", 9600);
            // creamos una instancia de un objeto del tipo "Invernadero"
            Invernadero invernadero = (Invernadero)FabricaEntidad.NuevoInvernadero();
            // creamos una instancia de un objeto del tipo "Humedad"
            Humedad humedad = (Humedad)FabricaEntidad.NuevaHumedad();
            // creamos una instancia de un objeto del tipo "Temperatura"
            Temperatura temperatura = (Temperatura)FabricaEntidad.NuevaTemperatura();
            // creamos una instancia de un objeto del tipo "Luminocidad"
            Luminosidad luminosidad = (Luminosidad)FabricaEntidad.NuevaLuminosidad();
            // creamos una instancia de un objeto del tipo "Acidez"
            Acides acidez = (Acides)FabricaEntidad.NuevaAcidez();

            // variables del tipo invernadero
            Terrae.Clases.Entidad _invernadero = Terrae.Clases.FabricaClase.FabricaEntidad.NuevoInvernadero();
            Terrae.Logica.Comandos.Comando<Terrae.Clases.Entidad> _comando;

            int id = Convert.ToInt32(1);
            (_invernadero as Terrae.Clases.Invernadero).Id = id;

            try
            {
                _comando = FabricaComando.CrearComandoConsultarVariable(_invernadero);
                // _invernadero = _comando.Ejecutar();
                // datos de la humedad
                // arduino.DigitalReadWrite("1");
                humedad.Nombre = "Humedad";
                //  humedad.setMedicion(arduino.ValorRetornado.ToString());
                // humedad.setMedicion((_invernadero as Terrae.Clases.Invernadero).Humedad.Medicion);
                humedad.Medicion = "80";
                // datos de la temperatura
                // arduino.DigitalReadWrite("2");
                temperatura.Nombre = "Temperatura";
                //temperatura.setMedicion(arduino.ValorRetornado.ToString());
                // temperatura.setMedicion((_invernadero as Terrae.Clases.Invernadero).Temperatura.Medicion);
                temperatura.Medicion = "25";

                // datos de la Luminosidad
                // arduino.DigitalReadWrite("3");
                luminosidad.Nombre = "Luminosidad";
                // luminocidad.setMedicion(arduino.ValorRetornado.ToString());
                luminosidad.Medicion = "200";
                // arduino.DigitalReadWrite("3.5");
                // luminocidad.setMedicion((_invernadero as Terrae.Clases.Invernadero).Luminosidad.Medicion);
                luminosidad.Medicion = "900";
                luminosidad.Status = ("Open");

                // datos de la Acidez
                // arduino.DigitalReadWrite("4");
                acidez.Nombre = "Acidez";
                // acidez.setMedicion(arduino.ValorRetornado.ToString());
                // acidez.setMedicion((_invernadero as Terrae.Clases.Invernadero).Acides.Medicion);
                acidez.Medicion = "50";

                // datos del tanque de agua
                // arduino.DigitalReadWrite("5");
                TanqueAgua tanqueAgua = (TanqueAgua)FabricaEntidad.NuevoTanqueAgua();
                tanqueAgua.Nombre = "TanqueAgua";
                tanqueAgua.Status = "Open";
                // tanqueAgua.setCantidad(arduino.ValorRetornado.ToString());
                tanqueAgua.Cantidad = "20";

                // datos del tanque de agua
                //  arduino.DigitalReadWrite("6");
                TanqueLiquidoEspecial tanqueLiquidoEspecial = 
                    (TanqueLiquidoEspecial)FabricaEntidad.NuevoTanqueLiquidoEspecial();
                tanqueLiquidoEspecial.Nombre = "TanqueLiquidoEspecial";
                tanqueLiquidoEspecial.Status = "Open";
                //tanqueLiquidoEspecial.setCantidad(arduino.ValorRetornado.ToString());
                tanqueLiquidoEspecial.Cantidad = "30";

                invernadero.Humedad = humedad;
                invernadero.Temperatura = temperatura;
                invernadero.Luminosidad = luminosidad;
                invernadero.Acides = acidez;
                invernadero.TanqueAgua = tanqueAgua;
                invernadero.TanqueLiquidoEspecial = tanqueLiquidoEspecial;
            }
            catch (Exception ex)
            {
                //throw new FormatException("Ocurrio un error", ex);
            }
            
        }

        /// <summary>
        /// Metodo para enviar el mensaje por el módulo de SMS
        /// </summary>
        /// <param name="tipoTanque"></param>
        public void EnvioMensaje(int tipoTanque)
        {
            Terrae.Clases.Entidad _persona = Terrae.Clases.FabricaClase.FabricaEntidad.NuevaPersona();
            Terrae.Logica.Comandos.Comando<Terrae.Clases.Entidad> _comando1;
            _persona.Id = 1;

            _comando1 = FabricaComando.CrearComandoConsultarPersona(_persona);
            
            string num = (_persona as Persona).Celular;

            if (tipoTanque == 1)
            {
                mensaje1 = "Alerta: El Tanque de Agua esta vacio";
            }
            if (tipoTanque == 2)
            {
                mensaje1 = "Alerta: El Tanque de Fertilizante esta vacio"; 
            }
                SerialPort sp = new SerialPort();
            sp.PortName = "COM9";
            sp.BaudRate = 9600;
            sp.DataBits = 8;
            sp.Parity = Parity.None;
            sp.StopBits = StopBits.One;
            sp.Handshake = Handshake.RequestToSend;
            sp.DtrEnable = true;
            sp.RtsEnable = true;
            sp.NewLine = System.Environment.NewLine;

            try
            {
                sp.Open();
                sp.WriteLine("AT\r");
                Thread.Sleep(4);
                sp.WriteLine("AT+CMGF=1\r");
                Thread.Sleep(5);
                sp.WriteLine("AT+CMGS=\"" + num.Trim() + "\"\r");
                Thread.Sleep(10);
                sp.WriteLine(">" + mensaje1.Trim() + '\x001a');

                sp.Close();
            }
            catch (Exception f)
            {
                Console.WriteLine(f.Message.ToString());
            }
        } // EnvioMensaje

        /// <summary>
        /// Evento que se ejecuta cuando Paramos el servicio de Windows
        /// </summary>
        protected override void OnStop()
        {
            verificarTanque = false;
            // llamamos a verificar el estado 
            VerificarEstadoTanque();

        } // OnStop
    }
}
